import { useEffect, useDebugValue } from 'react';
import { useAsyncState } from './useAsyncState';
import { asCallPromise } from './asCallPromise';

/**
 * 用于集成现有的 services 函数
 * const asyncState = usePromise(name, deps, ()=>Promise )
 * E 是 Error 类型
 * @param name dev-tools 中的 hook 的调试名称
 * @param deps 变化触发条件，第一个 dep 假值不执行
 * @param promiseCreator 返回 promise 的函数
 */
export function usePromise(
  name: string,
  deps: any[],
  promiseCreator: () => Promise<any>,
) {
  useDebugValue(name);
  const as = useAsyncState();
  useEffect(() => {
    let didCancel = false;
    if (deps.length && !deps[0]) return; // 如果第一个依赖项是假值则不触发执行
    asCallPromise(as, promiseCreator);
    return () => {
      didCancel = true;
    };
  }, deps);
  return as;
}
